#include "widget.h"
#include "./ui_widget.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QRegularExpression>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

#if 0
    chart = new QChart;
    //QLineSeries *lineSeris = new QLineSeries(this); // 直线图
    QSplineSeries *lineSeris = new QSplineSeries(this);  // 曲线图

    lineSeris->append(2, 5);
    lineSeris->append(3, 10);
    lineSeris->append(5, 15);
    lineSeris->append(7, 5);
    lineSeris->append(9, 10);
    lineSeris->append(10, 0);
    lineSeris->setName("温度变化");

    lineSeris->setVisible(true);

    chart->addSeries(lineSeris);

    QValueAxis *xAxis = new QValueAxis;
    xAxis->setRange(0, 12);
    xAxis->setTickCount(7); // 刻度 + 1
    xAxis->setTitleText(QString("时间"));

    QValueAxis *yAxis = new QValueAxis;
    yAxis->setRange(0,30);
    yAxis->setTickCount(7); // 刻度 + 1
    yAxis->setTitleText(QString("温度"));

    chart->setAxisX(xAxis, lineSeris);
    chart->setAxisY(yAxis, lineSeris);

    chartView = new QChartView(chart);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(chartView);

    this->setLayout(mainLayout);
#endif

    initSerialPort();
    initChart();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initSerialPort()
{
    serial = new QSerialPort(this);  // 初始化
    serial->setPortName("COM3");       // Windows 下如 "COM3"，Linux 下如 "/dev/ttyUSB0"
    serial->setBaudRate(QSerialPort::Baud115200);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);

    if (serial->open(QIODevice::ReadOnly)) {
        qDebug() << "串口已打开";
        // 数据接收绑定到槽函数
        connect(serial, &QSerialPort::readyRead, this, &Widget::readSerialData);
    } else {
        qDebug() << "串口打开失败：" << serial->errorString();
    }

}

void Widget::readSerialData() {
    buffer += serial->readAll();  // 追加新数据到缓冲区

    // 每条完整数据以换行符结尾（
    while (buffer.contains('\n')) {  // 检查是否有分隔符
        int pos = buffer.indexOf('\n');  // 找到分隔符位置
        QByteArray completeData = buffer.left(pos).trimmed();  // 提取完整数据
        buffer = buffer.mid(pos + 1);  // 移除已处理的数据

        QString text = QString::fromUtf8(completeData);  // 转为QString（UTF-8编码）
        qDebug() << "完整数据：" << text;
        parseSensorDataRegex(text);
        // 进一步处理 text（如解析温度、湿度）
        updateChart(temperature);
    }

}



void Widget::parseSensorDataRegex(const QString &data) {
    QRegularExpression regex("Temp:\\s*(\\d+\\.\\d+),\\s*Humi:\\s*(\\d+\\.\\d+)");
    QRegularExpressionMatch match = regex.match(data);

    if (match.hasMatch()) {
        temperature = match.captured(1).toFloat();
        humidity = match.captured(2).toFloat();
        qDebug() << "[正则] 温度:" << temperature << "湿度:" << humidity;
    } else {
        qDebug() << "数据格式不匹配";
    }
}

void Widget::initChart()
{
    chart = new QChart();
    series = new QSplineSeries();
    chart->addSeries(series);
    //chart->createDefaultAxes();
    chart->setTitle("串口数据实时曲线");

    QValueAxis *xAxis = new QValueAxis;
    xAxis->setRange(0, 20);
    xAxis->setTickCount(21); // 刻度 + 1
    xAxis->setTitleText(QString("时间"));

    QValueAxis *yAxis = new QValueAxis;
    yAxis->setRange(29.5,30.5);
    yAxis->setTickCount(11); // 刻度 + 1
    yAxis->setTitleText(QString("温度"));

    chart->setAxisX(xAxis, series);
    chart->setAxisY(yAxis, series);

    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    // 创建布局并添加 chartView
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(chartView);
    setLayout(layout);  // 应用布局到当前 Widget
}

void Widget::updateChart(double value)
{
    static int x = 0; // X 轴计数
    series->append(x++, value); // 添加新数据点

    // 限制显示 100 个点（避免内存无限增长）
    if (series->count() > 20) {
        series->remove(0); // 移除最旧的点
    }

    // 自动调整 X 轴范围
    chart->axisX()->setRange(x - 20, x);
}
